package com.game.autoTool.project.web.common;

import cn.hutool.core.util.ObjectUtil;
import com.benjaminwan.ocrlibrary.OcrResult;
import com.benjaminwan.ocrlibrary.TextBlock;
import io.github.mymonstercat.Model;
import io.github.mymonstercat.ocr.InferenceEngine;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

/**
 * ocr识图
 */
public class Ocr {


    public static void main(String[] args) {

//        String s = imgParser("E:\\bjdl\\autoTool\\src\\main\\resources\\imageTemplate\\识图案例.jpg");
        String s = imgParser("E:\\bjdl\\autoTool\\src\\main\\resources\\imageTemplate\\活动1.jpg");

        System.out.println(s);
    }

    /**
     * 图片解析
     *
     * @param imagePath
     */
    public static String imgParser(String imagePath) {
        String resStr = null;

        try {
            // 初始化推理引擎
            InferenceEngine engine = InferenceEngine.getInstance(Model.ONNX_PPOCR_V4);

            // 运行 OCR 并获取结果
            OcrResult ocrResult = engine.runOcr(imagePath);
//            System.out.println("识别结果为" + ocrResult);

            ArrayList<TextBlock> textBlocks = ocrResult.getTextBlocks();
            //TextBlock{boxPoint=[Point{x=1462, y=713}, Point{x=1553, y=713}, Point{x=1553, y=742}, Point{x=1462, y=742}], boxScore=0.7800038, angleIndex=-1, angleScore=0.0, angleTime=0.0, text='三界妖王', charScores=[0.99961084, 0.99998367, 0.9997358, 0.9965372], crnnTime=31.325699985027313, blockTime=31.325699985027313}
            for (TextBlock textBlock : textBlocks) {
                String text = textBlock.getText();

                if (text.equals("游荡妖魔")) {
                    System.err.println("ocr result=== " + text);
                }else {
                    System.out.println("ocr result=== " + text);
                }
            }


        } catch (Exception e) {
            e.printStackTrace();
        }

        return resStr;
    }


    /**
     * 识别完成后删除图片文件
     *
     * @param filePath 图片文件路径
     */
    private static void deleteImageFile(String filePath) {
        File file = new File(filePath);
        if (file.exists()) {
            if (file.delete()) {
                System.out.println("图片文件已成功删除: " + filePath);
            } else {
                System.out.println("删除图片文件失败: " + filePath);
            }
        } else {
            System.out.println("图片文件不存在: " + filePath);
        }
    }


    /**
     * 从本地文件加载图片并转换为BufferedImage
     *
     * @param imagePath 图片的本地路径
     * @return BufferedImage对象
     * @throws IOException 如果读取图片时出错
     */
    private static BufferedImage loadImageFromFile(String imagePath) throws IOException {
        return ImageIO.read(new File(imagePath));
    }

    /**
     * 将 BufferedImage 保存为文件并返回文件路径
     *
     * @param image BufferedImage 对象
     * @return 文件路径
     * @throws IOException 如果保存文件时出错
     */
    private static String saveImageToFile(BufferedImage image) throws IOException {
        // 获取当前时间戳
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String timestamp = dateFormat.format(new Date());
        // 构建带有时间戳的文件名
        String fileName = "temp_top_image_" + timestamp + ".jpg";
        File output = new File(fileName);

        // 先尝试直接保存
        try {
            ImageIO.write(image, "jpg", output);
            if (output.exists() && output.length() > 0) {
                return output.getAbsolutePath();
            }
        } catch (IOException e) {
            // 直接保存失败，尝试转换图像类型后保存
        }

        // 尝试转换为支持的类型（这里以 TYPE_INT_RGB 为例，去除透明度）
        BufferedImage convertedImage = convertToSupportedType(image, BufferedImage.TYPE_INT_RGB);
        try {
            ImageIO.write(convertedImage, "jpg", output);
            if (output.exists() && output.length() > 0) {
                return output.getAbsolutePath();
            }
        } catch (IOException e) {
            // 转换类型后保存仍失败，抛出异常
            throw new IOException("图片保存失败，即使转换类型后仍无法保存", e);
        }

        // 如果还是保存失败，抛出异常
        throw new IOException("图片保存失败，文件可能为空或不存在");
    }

    /**
     * 将 BufferedImage 转换为指定类型
     *
     * @param sourceImage 源图像
     * @param targetType  目标类型
     * @return 转换后的图像
     */
    private static BufferedImage convertToSupportedType(BufferedImage sourceImage, int targetType) {
        BufferedImage convertedImage = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), targetType);
        Graphics2D g2d = convertedImage.createGraphics();
        if (targetType == BufferedImage.TYPE_INT_RGB) {
            // 如果目标类型是 RGB（不支持透明度），填充白色背景
            g2d.setColor(Color.WHITE);
            g2d.fillRect(0, 0, convertedImage.getWidth(), convertedImage.getHeight());
        }
        g2d.drawImage(sourceImage, 0, 0, null);
        g2d.dispose();
        return convertedImage;
    }


}
